// 血糖测试数据生成页面
const app = getApp()
const api = require('../../utils/api')
const util = require('../../utils/util.js')

Page({
  data: {
    generating: false,
    count: 30,
    progress: 0,
    logs: []
  },

  onLoad() {
    // 页面加载完成
  },

  // 生成随机血糖值的函数
  generateRandomGlucose() {
    // 正常血糖范围内的随机值
    const normalGlucose = (Math.random() * 2.5 + 4.5).toFixed(1); // 4.5-7.0之间
    
    // 有20%的概率生成偏高或偏低的血糖值以增加数据多样性
    const anomalyFactor = Math.random();
    let glucose;
    
    if (anomalyFactor < 0.1) {
      // 偏低
      glucose = (Math.random() * 1.7 + 2.8).toFixed(1); // 2.8-4.5之间
    } else if (anomalyFactor > 0.9) {
      // 偏高
      glucose = (Math.random() * 5 + 7).toFixed(1); // 7.0-12.0之间
    } else {
      // 正常范围
      glucose = normalGlucose;
    }
    
    return parseFloat(glucose);
  },

  // 生成过去30天的随机时间点
  generateRandomTimestamps(count) {
    const timestamps = [];
    const now = new Date();
    const recordsPerDay = {}; // 用于记录每天已有的记录数量
    
    // 计算每天分配的记录数，确保平均分布
    const daysNeeded = Math.ceil(count / 3); // 每天最多3条，计算需要多少天
    const daysToUse = Math.min(daysNeeded, 30); // 最多使用30天
    
    // 创建过去30天的日期数组
    const availableDays = [];
    for (let i = 0; i < 30; i++) {
      const date = new Date(now);
      date.setDate(now.getDate() - i);
      date.setHours(0, 0, 0, 0);
      availableDays.push(date);
    }
    
    // 随机打乱日期数组以确保数据分布更随机
    const shuffledDays = [...availableDays]; // 创建一个副本进行打乱
    shuffledDays.sort(() => Math.random() - 0.5);
    
    // 仅使用需要的天数
    const selectedDays = shuffledDays.slice(0, daysToUse);
    
    console.log(`将使用 ${selectedDays.length} 天进行数据生成`);
    
    // 遍历生成记录
    let recordCount = 0;
    let attempts = 0;
    const maxAttempts = count * 2; // 设置最大尝试次数以避免无限循环
    
    while (recordCount < count && attempts < maxAttempts) {
      attempts++;
      
      // 选择一个随机日期
      const dayIndex = Math.floor(Math.random() * selectedDays.length);
      const baseDate = new Date(selectedDays[dayIndex]);
      const dateString = baseDate.toISOString().split('T')[0];
      
      // 检查该日期的记录数是否已达上限
      recordsPerDay[dateString] = recordsPerDay[dateString] || 0;
      if (recordsPerDay[dateString] >= 3) {
        // 如果该日期已有3条记录，跳过
        continue;
      }
      
      // 根据每天记录的计数确定测量时段
      let recordIndex = recordsPerDay[dateString];
      
      // 根据测量时段设置不同的时间
      let hours, minutes;
      switch (recordIndex) {
        case 0: // 早餐前，6:00-8:00
          hours = Math.floor(Math.random() * 2) + 6;
          break;
        case 1: // 午餐前，11:00-13:00
          hours = Math.floor(Math.random() * 2) + 11;
          break;
        case 2: // 晚餐前或睡前，17:00-22:00
          hours = Math.floor(Math.random() * 5) + 17;
          break;
      }
      
      minutes = Math.floor(Math.random() * 60);
      
      // 设置时间
      const timestamp = new Date(baseDate);
      timestamp.setHours(hours, minutes, 0, 0);
      
      // 添加时间戳并增加该日期的记录计数
      timestamps.push(timestamp.toISOString());
      recordsPerDay[dateString]++;
      recordCount++;
    }
    
    // 检查生成的数据分布
    console.log(`成功生成 ${timestamps.length} 条记录，使用了 ${Object.keys(recordsPerDay).length} 天`);
    
    // 按时间排序
    return timestamps.sort();
  },

  // 生成血糖测试数据的方法
  async generateTestData() {
    if (this.data.generating) {
      return;
    }

    this.setData({
      generating: true,
      progress: 0,
      logs: ['开始生成测试数据...']
    });

    const count = this.data.count;
    const timestamps = this.generateRandomTimestamps(count);
    
    // 计算最终实际生成的记录数
    const actualCount = timestamps.length;
    this.appendLog(`将生成${actualCount}条测试数据，每天最多3条记录...`);
    
    // 检查API模式
    const isRealAPI = api.health.useRealApi;
    this.appendLog(`当前API模式: ${isRealAPI ? '真实API' : '模拟数据'}`);
    
    for (let i = 0; i < actualCount; i++) {
      const value = this.generateRandomGlucose();
      const measuredAt = timestamps[i];
      
      // 确定记录的测量时段
      const date = new Date(measuredAt);
      const hours = date.getHours();
      let period;
      
      if (hours < 10) {
        period = '早餐前';
      } else if (hours < 15) {
        period = '午餐前';
      } else if (hours < 19) {
        period = '晚餐前';
      } else {
        period = '睡前';
      }
      
      const formattedDate = `${date.getFullYear()}-${(date.getMonth() + 1).toString().padStart(2, '0')}-${date.getDate().toString().padStart(2, '0')}`;
      const formattedTime = `${date.getHours().toString().padStart(2, '0')}:${date.getMinutes().toString().padStart(2, '0')}`;
      
      const log = `添加记录 #${i+1}: ${value} mmol/L，日期: ${formattedDate}，时间: ${formattedTime}，时段: ${period}`;
      this.appendLog(log);
      
      try {
        // 创建记录数据对象
        const recordData = {
          value,
          measuredAt,
          period, // 添加测量时段
          note: '测试数据'
        };
        
        console.log(`[生成记录] #${i+1} 数据:`, JSON.stringify(recordData));
        console.log(`[生成记录] measuredAt 类型:`, typeof recordData.measuredAt);
        console.log(`[生成记录] measuredAt 值:`, recordData.measuredAt);
        console.log(`[生成记录] 解析后的日期:`, new Date(recordData.measuredAt).toLocaleString());
        
        // 正确调用API - 第一个参数是类型，第二个参数是数据对象
        const result = await api.health.addRecord('glucose', recordData);
        
        if (result) {
          this.appendLog(`记录 #${i+1} 添加成功`);
        } else {
          this.appendLog(`记录 #${i+1} 添加失败`);
        }
        
        this.setData({
          progress: Math.floor(((i + 1) / actualCount) * 100)
        });
        
        // 添加一个小延迟，避免请求过快
        await new Promise(resolve => setTimeout(resolve, 300));
        
      } catch (error) {
        const errorLog = `添加记录 #${i+1} 失败: ${error.message || error}`;
        this.appendLog(errorLog);
        console.error(errorLog, error);
      }
    }
    
    this.appendLog('测试数据添加完成！');
    this.setData({ generating: false });
    
    // 完成后刷新当前页面，以便立即看到折线图变化
    wx.showToast({
      title: '数据已添加',
      icon: 'success',
      duration: 2000,
      complete: () => {
        setTimeout(() => {
          // 返回上一页，以便重新加载数据
          wx.navigateBack();
        }, 2000);
      }
    });
  },
  
  // 添加日志
  appendLog(log) {
    this.setData({
      logs: [...this.data.logs, log]
    });
  },
  
  // 取消生成
  cancelGeneration() {
    this.setData({ generating: false });
    this.appendLog('已取消生成');
  },
  
  // 修改生成数量
  changeCount(e) {
    this.setData({
      count: parseInt(e.detail.value, 10) || 30
    });
  }
}); 